<html><head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>Procedures</title></head>
<body bgcolor="#EFF1F0" link="#3A3966" vlink="#000000" alink="#000000">
<font face="Verdana, sans-serif" size="2"><p align="center"><b><font size="5">Procedures</font></b></p>

<br><b>语法</b><blockquote><pre><font face="Courier New, Courier, mono"size="2"><b><font color="#3A3966">Procedure</font></b>[.&lt;type&gt;] name(&lt;parameter1[.&lt;type&gt;]&gt; [, &lt;parameter2[.&lt;type&gt;] [= DefaultValue]&gt;, ...]) 
  ...
  [<b><font color="#3A3966">ProcedureReturn</font></b> value]
<b><font color="#3A3966">EndProcedure</font></b> 
</font></pre></blockquote>
<b>概要</b><br><blockquote>


<b><font color="#3A3966">Procedure</font></b>独立于主体代码，它的任何参数都是自有<a href="variables.html">变量</a>。在 PureBasic中，递归调用是完全受支持的，任何程序都可以自己调用自己。在每次调用该过程内的变量初始值将为 0 （null）。若要访问主代码变量, 必须要引用<a href="shared.html">Shared</a> 或者 <a href="global.html">Global</a> 关键词 (请查看 <a href="protected.html">Protected</a> 和 <a href="static.html">Static</a> 关键词). <br><br>后面的参数可以有一个默认值 （必须是一个常数表达式），所以如果在调用过程时省略这些参数，将使用默认值。<br><br><a href="dim.html">数组</a> 可以通过引用 <b><font color="#3A3966">Array</font></b> 关键词, <a href="newlist.html">列表</a> 可以引用 <b><font color="#3A3966">List</font></b> 关键词并且<a href="newmap.html">映射</a>可以使用 <b><font color="#3A3966">Map</font></b> 关键词. <br><br>如有必要，过程可以返回值或字符串。如果需要设置类型您可以在过程的 <b><font color="#3A3966">Procedure</font></b> 之后同且在使用 <b><font color="#3A3966">ProcedureReturn</font></b> 关键词之前的任何时候. 调用 <b><font color="#3A3966">ProcedureReturn</font></b> 将立即退出过程,即便它在一个循环内. <br><b><font color="#3A3966">ProcedureReturn</font></b> 不能用于返回 <a href="dim.html">数组</a>, <a href="newlist.html">列表</a> 或 一个 <a href="newmap.html">映射</a>. 因此数组、 列表或地图通过作为参数传递给过程。<br><br>如果没有指定值给 <b><font color="#3A3966">ProcedureReturn</font></b>，则返回值为未定义的 (请查看 <a href="inlinedasm.html">行内嵌汇编</a> 了解更多信息). <br><br>注意︰ 若要从 Dll 返回字符串，请参见<a href="dll.html">Dll</a>。针对高级程序员 <b><font color="#3A3966">ProcedureC</font></b> 可用并且声明采用 'CDecl' 替换 'StandardCall' 的调用约定的程序. <br><br>所选的程序可以异步执行但需在主程序使用<a href="../thread/index.html">线程</a> 


</blockquote><p><b>示例︰</b>具有数字变量作为返回值的过程</p><blockquote>


<pre><font face="Courier New, Courier, mono"size="2">  <b><font color="#3A3966">Procedure</font></b> <font color="#3A3966">Maximum</font>(nb1, nb2)
    <b><font color="#3A3966">If</font></b> nb1 &gt; nb2
      Result = nb1
    <b><font color="#3A3966">Else</font></b>
      Result = nb2
    <b><font color="#3A3966">EndIf</font></b>
  
    <b><font color="#3A3966">ProcedureReturn</font></b> Result
  <b><font color="#3A3966">EndProcedure</font></b>
  
  Result =<font color="#3A3966"> Maximum</font>(15, 30)
  <b><font color="#3A3966">Debug</font></b> Result
</font></pre>


</blockquote><p><b>示例︰</b>具有一个字符串作为返回值的过程</p><blockquote>


<pre><font face="Courier New, Courier, mono"size="2">  <b><font color="#3A3966">Procedure</font></b>.s <font color="#3A3966">Attach</font>(String1$, String2$)
    <b><font color="#3A3966">ProcedureReturn</font></b> String1$+" "+String2$
  <b><font color="#3A3966">EndProcedure</font></b> 

  Result$ =<font color="#3A3966"> Attach</font>("PureBasic", "Coder")
  <b><font color="#3A3966">Debug</font></b> Result$
</font></pre>


</blockquote><p><b>示例︰</b>具有默认值的参数</p><blockquote>


<pre><font face="Courier New, Courier, mono"size="2">  <b><font color="#3A3966">Procedure</font></b> <font color="#3A3966">a</font>(a, b, c=2)
    <b><font color="#3A3966">Debug</font></b> c
  <b><font color="#3A3966">EndProcedure</font></b>

<font color="#3A3966">  a</font>(10, 12)      <font color="#3A3966">; 2 will be used as default value for 3rd parameter</font>
<font color="#3A3966">  a</font>(10, 12, 15) 
</font></pre>

</blockquote><p><b>示例︰</b>作为参数列表</p><blockquote>


<pre><font face="Courier New, Courier, mono"size="2">  <b><font color="#3A3966">NewList</font></b> <font color="#3A3966">Test</font>.Point()

<font color="#3A3966">  AddElement</font>(<font color="#3A3966">Test</font>())
<font color="#3A3966">  Test</font>()\x = 1
<font color="#3A3966">  AddElement</font>(<font color="#3A3966">Test</font>())
<font color="#3A3966">  Test</font>()\x = 2

  <b><font color="#3A3966">Procedure</font></b> <font color="#3A3966">DebugList</font>(c.l, <b><font color="#3A3966">List</font></b> <font color="#3A3966">ParameterList</font>.Point())

<font color="#3A3966">    AddElement</font>(<font color="#3A3966">ParameterList</font>())
<font color="#3A3966">    ParameterList</font>()\x = 3

    <b><font color="#3A3966">ForEach</font></b> <font color="#3A3966">ParameterList</font>()
<font color="#3A3966">      MessageRequester</font>("List",<font color="#3A3966"> Str</font>(<font color="#3A3966">ParameterList</font>()\x))
    <b><font color="#3A3966">Next</font></b>
 
  <b><font color="#3A3966">EndProcedure</font></b>

<font color="#3A3966">  DebugList</font>(10,<font color="#3A3966"> Test</font>())
</font></pre>

</blockquote><p><b>示例︰</b>数组作为参数</p><blockquote>


<pre><font face="Courier New, Courier, mono"size="2">  <b><font color="#3A3966">Dim</font></b> <font color="#3A3966">Table</font>.Point(10, 15)

<font color="#3A3966">  Table</font>(0,0)\x = 1
<font color="#3A3966">  Table</font>(1,0)\x = 2

  <b><font color="#3A3966">Procedure</font></b> <font color="#3A3966">TestIt</font>(c.l, <b><font color="#3A3966">Array</font></b> <font color="#3A3966">ParameterTable</font>.Point(2))  <font color="#3A3966">; The table support 2 dimensions</font>

<font color="#3A3966">    ParameterTable</font>(1, 2)\x = 3
<font color="#3A3966">    ParameterTable</font>(2, 2)\x = 4
 
  <b><font color="#3A3966">EndProcedure</font></b>

<font color="#3A3966">  TestIt</font>(10,<font color="#3A3966"> Table</font>())

<font color="#3A3966">  MessageRequester</font>("Table",<font color="#3A3966"> Str</font>(<font color="#3A3966">Table</font>(1, 2)\x))
</font></pre>



</blockquote>
<br><b>语法</b><blockquote><pre><font face="Courier New, Courier, mono"size="2"><b><font color="#3A3966">Declare</font></b>[.&lt;type&gt;] name(&lt;parameter1[.&lt;type&gt;]&gt; [, &lt;parameter2[.&lt;type&gt;] [= DefaultValue]&gt;, ...])
</font></pre></blockquote>
<b>概要</b><br><blockquote>


有时一个程序需要调用另一个过程而不在其定义之前声明。这是令人讨厌的因为编译器会抱怨“Procedure&lt;name&gt;无法找到”。<b><font color="#3A3966">Declare</font></b> 可以在这种特定情况下仅在头中声明过程. 然而使用 <b><font color="#3A3966">Declare</font></b> 和实际的 <b><font color="#3A3966">Procedure</font></b> 定义必须相同 (包括正确的类型和可选的参数，如果有的话。)。<br><br>针对高级程序员<b><font color="#3A3966">DeclareC</font></b>是可用的并且将声明过程采用 'CDecl' 而不是 'StandardCall' 调用约定。 

</blockquote><p><b>示例</b></p><blockquote>


<pre><font face="Courier New, Courier, mono"size="2">  <b><font color="#3A3966">Declare</font></b> <font color="#3A3966">Maximum</font>(Value1, Value2)
  
  <b><font color="#3A3966">Procedure</font></b> <font color="#3A3966">Operate</font>(Value)
<font color="#3A3966">    Maximum</font>(10, 2)      <font color="#3A3966">; At this time, Maximum() is unknown.</font>
  <b><font color="#3A3966">EndProcedure</font></b>
  
  <b><font color="#3A3966">Procedure</font></b> <font color="#3A3966">Maximum</font>(Value1, Value2)
    <b><font color="#3A3966">ProcedureReturn</font></b> 0
  <b><font color="#3A3966">EndProcedure</font></b>
</font></pre>
</body></html>